﻿using System;
using System.Configuration;
using System.Linq;
using System.Web.Mvc;
using System.Threading;
using Viettel.VOFFICE.DAO.Models;
using Viettel.VOFFICE.Web.Helpers;
using Viettel.VOFFICE.DAO.DAL;
using Viettel.VOFFICE.Web.Models;

namespace Viettel.VOFFICE.Web.Controllers
{
    public class BaseController : Controller
    {
        /// <summary>
        /// ctor
        /// </summary>
        public BaseController() { }

        /// <summary>
        /// Ghi đè tiến trình của controller
        /// Thay đổi culture của tiến trình
        /// </summary>
        protected override void ExecuteCore()
        {
            string cultureName = null;
            // Attempt to read the culture cookie from Request
            var cultureCookie = Request.Cookies["_culture"];
            if (cultureCookie != null)
            {
                cultureName = cultureCookie.Value;
            }
            else
            {
                // obtain it from HTTP header AcceptLanguages
                cultureName = Request.UserLanguages != null ? Request.UserLanguages[0] : "vi-VN";
            }
            // Validate culture name
            cultureName = CultureHelper.GetImplementedCulture(cultureName); // This is safe
            // Modify current thread's cultures            
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

            base.ExecuteCore();
        }

        /// <summary>
        /// Lấy thông tin về người dùng đang đăng nhập hệ thống
        /// </summary>
        /// <returns></returns>
        public AppInfo GetAppInfo()
        {
            return null;
        }

        public System.Guid? GetCurentUserId()
        {
            var first = GetCurrentUser();
            if (first != null) return first.UserId;
            return null;
        }

        public aspnet_Users GetCurrentUser()
        {
            if (User.Identity.IsAuthenticated)
            {
                var curentUser = User.Identity.Name;
                return unitOfWork.UserRepository.FindByName(curentUser).FirstOrDefault();
            }
            return null;
        }

        public Guid ApplicationId
        {
            get
            {
                return unitOfWork.RoleRepository.GetMailApplicationId(LoweredApplicationName);
            }
        }
        public string ApplicationName
        {
            get
            {
                return ConfigurationManager.AppSettings["applicationName"];
            }
        }
        public string LoweredApplicationName
        {
            get
            {
                return ConfigurationManager.AppSettings["applicationName"].ToLower();
            }
        }
        /// <summary>
        /// Tên của action
        /// </summary>
        public string ActionName { get; private set; }

        /// <summary>
        /// Lấy tên của controller
        /// </summary>
        public string ControllerName { get; private set; }

        /// <summary>
        /// khi Action bắt đầu thực thi
        /// Khi thêm dữ liệu vào ViewBag hay các thông tin cần thiết
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var actionDescriptor = filterContext.ActionDescriptor;
            ActionName = actionDescriptor.ActionName;
            ControllerName = actionDescriptor.ControllerDescriptor.ControllerName;

            //lay thong tin de dung menu
            if (ControllerName.ToUpper() == "ADMIN")
            {
                var lstMenu = unitOfWork.SystemMenuRepository.GetRootMenu();
                var rootNode = new SystemMenuModel
                {
                    id = 0,
                    Name = Resources.Resources.ManageSystemMenu_RootNodeMenu,
                    NavigatorUrl = ""
                };
                foreach (var menu in lstMenu)
                {
                    var itemNode = new SystemMenuModel()
                    {
                        id = menu.id,
                        Name = menu.Name,
                        NavigatorUrl = ""
                    };
                    PopulateTree(menu.id, itemNode);
                    rootNode.Children.Add(itemNode);
                }
                ViewBag.Nodes = rootNode;
            }

            //lay thong tin appinfo 
            if (ControllerName.ToUpper() == "SYSTEM")
            {
                var appInfo = new AppInfo(GetCurrentUser());
                ViewBag.AppInfo = appInfo;
            }

            base.OnActionExecuting(filterContext);
        }
        private void PopulateTree(int rootPath, SystemMenuModel rootNode)
        {
            foreach (var item in unitOfWork.SystemMenuRepository.GetByParentId(rootPath))
            {
                var newRoot = new SystemMenuModel { id = item.id, Name = item.Name, NavigatorUrl = item.NavigatorUrl };
                PopulateTree(item.id, newRoot);
                rootNode.Children.Add(newRoot);
            }
        }
        /// <summary>
        /// Nắm giữ kết nối đến csdl
        /// Các Repository truy xuất đến csdl
        /// </summary>
        private UnitOfWork _unitOfWork;
        public UnitOfWork unitOfWork
        {
            get { return _unitOfWork ?? (_unitOfWork = new UnitOfWork()); }
        }
    }
}
